ALV Editierbar machen
Dieses kurze Programm zeigt, was nötig ist, um eine Tabelle in einem ALV-Grid editieren zu können. Der Name der Datenbanktabelle wird einmal festgelegt und das Programm erzeugt die entsprechenden Datentabelle und liest die Daten von der Datenbank. Das Eingabe bereite Grid wird angezeigt und kann editiert werden.
Das unten stehende Programm erzeugt selbstständig die Datenstrukturen für die Tabelle T005, liest die ersten zehn Datensätze von der Datenbank und zeigt sie in einem editierbaren ALV-Grid an.
Beim Verlassen der Anwendung werden die Daten als Liste ausgegeben.
HINWEIS:
Die Methode Handle_Data_Changed wird erst aufgerufen, nachdem die ENTER-Taste gedrückt wurde!!!
Sollen die Änderungen auch nach dem Druck einer Funktionstaste übernommen werden, so muss vorher die Methode CHECK_DATA_CHANGED aufgerufen werden! Es sei denn, Sie registrieren nicht den MC_EVT_ENTER sondern nehmen stattdessen den MC_EVT_MODIFIED… Dann erfolgt die Datenänderung sofort, nachdem das Feld verlassen wird.
Es erfolgt natürlich keine Änderung auf der Datenbank!
Die Tabelle T005 wird in einem ALV Grid geändert |
Coding
*&---------------------------------------------------------------------* *& Report ZZ_ALV_EDIT *&---------------------------------------------------------------------* REPORT zz_alv_edit LINE-SIZE 1000. *** Variablen DATA: *** Pointer für CREATE DATA gref TYPE REF TO data, *** Name der Datenbanktabelle gv_sname LIKE dd02l-tabname VALUE 'T005', *** Feldkatalog gt_fcat TYPE lvc_t_fcat. *** Feld-Symbole FIELD-SYMBOLS: *** Feldkatalog <fcat> TYPE lvc_s_fcat, *** Feld der Struktur <feld> TYPE ANY, *** Arbeitsbereich der internen Tabelle <wa> TYPE ANY, *** Die interne Tabelle mit Struktur aus GV_SNAME <itab> TYPE table. *----------------------------------------------------------------------* * CLASS lcl_events DEFINITION *----------------------------------------------------------------------* CLASS lcl_events DEFINITION. PUBLIC SECTION. METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed sender. ENDCLASS. "lcl_events DEFINITION *---------------------------------------------------------------------* * CLASS lcl_rohr_eventhandler IMPLEMENTATION *---------------------------------------------------------------------* CLASS lcl_events IMPLEMENTATION. METHOD handle_data_changed. ****************************************** *** HandleDataChanged *** ****************************************** DATA: ls_good TYPE lvc_s_modi. *** alle Inhalte der geänderten Zellen in die interne Tabelle schreiben LOOP AT er_data_changed->mt_good_cells INTO ls_good. *** Dazu auf die richtige Zeile in der ITAB positionieren: READ TABLE <itab> ASSIGNING <wa> INDEX ls_good-row_id. IF sy-subrc = 0. *** Und das geänderte Feld dem Feldsymbol zuweisen ASSIGN COMPONENT ls_good-fieldname OF STRUCTURE <wa> TO <feld>. IF sy-subrc = 0. *** Feldwert zuweisen <feld> = ls_good-value. ENDIF. ENDIF. ENDLOOP. ENDMETHOD. "handle_data_changed ENDCLASS. "lcl_events IMPLEMENTATION *** Variablen ALV DATA: ref_alv TYPE REF TO cl_gui_alv_grid, ref_container TYPE REF TO cl_gui_custom_container, ref_alv_events TYPE REF TO lcl_events. *** Programmstart START-OF-SELECTION. *** Aufruf des Dynpros CALL SCREEN 4000. *&---------------------------------------------------------------------* *& Form init *&---------------------------------------------------------------------* FORM init. *** Container erzeugen CHECK ref_alv IS INITIAL. CREATE OBJECT ref_container EXPORTING container_name = 'ALV'. TRY. *** Erzeugung der Datenstrukturen zur Laufzeit CREATE DATA gref TYPE STANDARD TABLE OF (gv_sname). ASSIGN gref->* TO <itab>. *** Einlesen der Daten SELECT * FROM (gv_sname) INTO TABLE <itab> UP TO 10 ROWS. *** Fehler abfangen CATCH cx_sy_create_data_error. WRITE 'Wrong Database!'. ENDTRY. *** Feldkatalog einlesen CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = gv_sname CHANGING ct_fieldcat = gt_fcat EXCEPTIONS OTHERS = 3. *** Alle Felder editierbar machen LOOP AT gt_fcat ASSIGNING <fcat>. <fcat>-edit = 'X'. ENDLOOP. *** ALV erzeugen PERFORM create_alv. ENDFORM. "init *&---------------------------------------------------------------------* *& Module STATUS_4000 OUTPUT *&---------------------------------------------------------------------* MODULE status_4000 OUTPUT. *** Status SET TITLEBAR '4000'. SET PF-STATUS 'STLI' OF PROGRAM 'SAPMSSY0'. *** Clear CLEAR sy-ucomm. *** Init ALV PERFORM init. ENDMODULE. " STATUS_4000 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_4000 INPUT *&---------------------------------------------------------------------* MODULE user_command_4000 INPUT. CASE sy-ucomm. WHEN 'BACK' OR '%EX' OR 'RW'. *** Liste LEAVE TO LIST-PROCESSING. SET PF-STATUS space. *** Tabelleninhalt ausgeben LOOP AT <itab> ASSIGNING <wa>. NEW-LINE. DO. ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <feld>. IF sy-subrc = 0. *** Ausgabe des Feldes WRITE: <feld>. ELSE. EXIT. "from DO-LOOP ENDIF. ENDDO. ENDLOOP. *** Exit SET SCREEN 0. LEAVE SCREEN. ENDCASE. ENDMODULE. " USER_COMMAND_4000 INPUT *&---------------------------------------------------------------------* *& Form create_alv *&---------------------------------------------------------------------* FORM create_alv . *** ALV anbinden CREATE OBJECT ref_alv EXPORTING i_parent = ref_container i_appl_events = 'X' EXCEPTIONS OTHERS = 5. *** Edit-Event extra registrieren ref_alv->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_enter ). *** Edit-Mode aktiv setzen ref_alv->set_ready_for_input( i_ready_for_input = 1 ). *** ...und EventHandler zuweisen CREATE OBJECT ref_alv_events. SET HANDLER ref_alv_events->handle_data_changed FOR ref_alv. *** First Display CALL METHOD ref_alv->set_table_for_first_display CHANGING it_fieldcatalog = gt_fcat it_outtab = <itab> EXCEPTIONS OTHERS = 4. *** Fokus auf das Grid setzen cl_gui_alv_grid=>set_focus( ref_alv ). *** Flush CALL METHOD cl_gui_cfw=>flush. ENDFORM. " create_alv
Dynpro-Ablauflogik
PROCESS BEFORE OUTPUT.
MODULE STATUS_4000.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_4000.
HINWEIS:
Auf dem Dynpro muss ein “Custom Container” mit Namen “ALV” angelegt werden.
TIPP für Version ECC 5.0:
Wenn Sie in den Eigenschaften des Dynpros das Häkchen “Ohne Applikationsbar” setzen, dann wird die Zeile, in der normalerweise die Druckknöpfe stehen, ausgeblendet und es steht Ihnen mehr Platz für das ALV-Grid zur Verfügung!
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024